/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package managedBeans;

import dao.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import pojo.*;

/**
 *
 * @author Rodolfo
 */
@ManagedBean
@SessionScoped
public class AgendamentoBean {

    @EJB
    private DaoDoutorLocal daoDoutor;
    @EJB
    private DaoAgendamentoLocal daoAgendamento;
    @EJB
    private DaoPessoaLocal daoPessoa;
    @EJB
    private DaoItemLocal daoServico;
    @EJB
    private GeraHorarioLocal geraHorario;
    private Agendamento agendamento;
    private Item servico;
    private SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
    private String nomePessoa;
    private String descricaoServico;
    private boolean editando;
    private Agendamento agendamentoAnterior;
    private ServicoAgendamento servicoItem;
    private Doutor doutorPesquisa = null;
    private Date dataInicial = null;
    private Date dataFinal = null;

    public AgendamentoBean() {
        this.agendamento = new Agendamento();
        this.servico = new Item();
        this.servicoItem = new ServicoAgendamento();
        this.editando = false;

    }

    public Agendamento getAgendamento() {
        return agendamento;
    }

    public void setAgendamento(Agendamento agendamento) {
        this.agendamento = agendamento;
    }

    public Agendamento getAgendamentoSelecionado() {
        return agendamento;
    }

    public void setAgendamentoSelecionado(Agendamento agendamentoSelecionado) {
        if (agendamentoSelecionado != null) {
            System.out.println("entrou no set agendamento selecioando bicho véio");
            this.agendamento = daoAgendamento.selecionaAgendamentoId(agendamentoSelecionado.getIdAgendamento());
        }
    }

    public void novo(ActionEvent actionEvent) {
        agendamentoAnterior = agendamento;
        agendamento = new Agendamento();
        editando = true;
    }

    public void salvar(ActionEvent actionEvent) {
        boolean temErro = false;
        boolean excessaoData = false;
        boolean excessaoHorario = false;
        if (agendamento.getHorario() == null) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "O horário deve ser informado!", null));
            temErro = true;
        }
        if (agendamento.getCodCliente() == null) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "O cliente deve ser informado!", null));
            temErro = true;
        }
        if (!temErro) {
            System.out.println("entrou aki no salvar agendamento");
            System.out.println("entrou aki no salvar agendamento" + agendamento.getCodDoutor()+ " "+ agendamento.getData() + " "+ agendamento.getHorario());
            excessaoData = geraHorario.verificaExcessaoData(agendamento.getCodDoutor(), agendamento.getData());
            excessaoHorario = geraHorario.verificaExcessaoDataHora(agendamento.getCodDoutor(), agendamento.getData(), agendamento.getHorario());
            
            if (excessaoData || excessaoHorario) {
                System.out.println("entrou aki no salvar agendamento" + agendamento.getCodDoutor()+ " "+ agendamento.getData() + " "+ agendamento.getHorario());
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "O horário não está diponível, selecione outro!", null));
                temErro = true;
            }
        }
        if (!temErro) {
            agendamento.setStatus('A');
            try {
                agendamento = daoAgendamento.salvar(agendamento);
                editando = false;
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Registro gravado com sucesso."));
            } catch (Exception ex) {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, ex.getMessage(), null));
            }
        }

    }

    public void editar(ActionEvent actionEvent) {
        agendamentoAnterior = new Agendamento(agendamento);
        editando = true;
    }

    public void excluir(ActionEvent actionEvent) {
        try {
            daoAgendamento.excluir(agendamento);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Excluido com sucesso"));
            agendamento = new Agendamento();
        } catch (Exception ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, ex.getMessage(), null));
        }

        editando = false;
    }

    public void cancelar(ActionEvent actionEvent) {
        agendamento = agendamentoAnterior;
        editando = false;
    }

    public boolean isSalvarDesativado() {
        return !editando;
    }

    public boolean isCamposDesativados() {
        return !editando;
    }

    public boolean isNovoDesativado() {
        return editando;
    }

    public boolean isEditarDesativado() {
        System.out.println("editando: " + editando);
        System.out.println("agendamentoId: " + agendamento.getIdAgendamento());
        return (editando || agendamento.getIdAgendamento() == null);
    }

    public boolean isExcluirDesativado() {
        return isEditarDesativado();
    }

    public boolean isCancelarDesativado() {
        return isSalvarDesativado();
    }

    public boolean isPesquisarDesativado() {
        return isNovoDesativado();
    }

    public void adicionaServico(ActionEvent actionEvent) {
        boolean achou = false;
        System.out.println(agendamento);
        System.out.println(agendamento.getServicoAgendamentoList());
        if (agendamento.getServicoAgendamentoList() == null) {
            agendamento.setServicoAgendamentoList(new ArrayList<ServicoAgendamento>());
        }
        if (servicoItem != null) {
            if (!agendamento.getServicoAgendamentoList().isEmpty()) {
                for (ServicoAgendamento servicoAgendamento : agendamento.getServicoAgendamentoList()) {
                    if (servicoAgendamento.getCodServico().getDescricao().equals(servicoItem.getCodServico().getDescricao())) {
                        achou = true;
                        break;
                    }
                }
            }

            if (!achou) {
                agendamento.getServicoAgendamentoList().add(servicoItem);
            } else {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não é possível adicionar um serviço repetido!!!", null));
            }
        }
    }

    public void removeServico(ActionEvent actionEvent) {
        if (getServicosSelecionado() != null && servicoItem != null) {
            System.out.println(servicoItem.getCodServico().getDescricao());
            getServicosSelecionado().remove(servicoItem);
        }
    }

    public List<ServicoAgendamento> getServicosSelecionado() {
        return agendamento.getServicoAgendamentoList();
    }

    public ServicoAgendamento getServicoItem() {
        return servicoItem;
    }

    public void setServicoItem(ServicoAgendamento servicoItem) {
        this.servicoItem = servicoItem;
    }

    public void setServico(Item servico) {
        this.servico = servico;
        if (servico != null) {
            servicoItem = new ServicoAgendamento();
            servicoItem.setCodAgendamento(agendamento);
            servicoItem.setCodServico(servico);
        } else {
            servicoItem = null;
        }
    }

    public Item getServico() {
        return servico;
    }

    public String getDescricaoServico() {
        return descricaoServico;
    }

    public void setDescricaoServico(String descricaoServico) {
        this.descricaoServico = descricaoServico;
    }

    public Pessoa getCliente() {
        return agendamento.getCodCliente();
    }

    public void setCliente(Pessoa pessoaSelecionada) {
        this.agendamento.setCodCliente(pessoaSelecionada);
    }

    public String getNomePessoa() {
        return nomePessoa;
    }

    public void setNomePessoa(String nomeDoutor) {
        this.nomePessoa = nomeDoutor;
    }

    public Date getData() {
        return agendamento.getData();
    }

    public void setData(Date data) {
        agendamento.setData(data);
    }

    public Date getHorario() {
        return agendamento.getHorario();
    }

    public void setHorario(Date horario) {
        agendamento.setHorario(horario);
    }

    public char getStatus() {
        return agendamento.getStatus();
    }

    public void setStatus(char status) {
        agendamento.setStatus(status);
    }

    public Doutor getCodDoutor() {
        return agendamento.getCodDoutor();
    }

    public void setCodDoutor(Doutor codDoutor) {
        agendamento.setCodDoutor(codDoutor);
    }

    public Pessoa getCodCliente() {
        return agendamento.getCodCliente();
    }

    public void setCodCliente(Pessoa codCliente) {
        agendamento.setCodCliente(codCliente);
    }

    public void setDoutorSelecionado(Integer doutorSelecionado) {
        System.out.println("entro aki no setdoutroselecionado");
        setCodDoutor(daoDoutor.buscaDoutorPorId(doutorSelecionado));
    }

    public Integer getDoutorSelecionado() {
        System.out.println("entro aki no gggetdoutroselecionado");
        System.out.println(agendamento == null);
        System.out.println(agendamento.getCodDoutor() == null);
        if (agendamento.getCodDoutor() != null) {
            return agendamento.getCodDoutor().getIdDoutor();
        }
        return null;
    }
    
    public void setDoutorPesquisa(Integer doutorSelecionado) {
        System.out.println("entro aki no SETDOUTORPESQUISA");
        doutorPesquisa = daoDoutor.buscaDoutorPorId(doutorSelecionado);
    }

    public Integer getDoutorPesquisa() {
        System.out.println("entro aki no GETDOUTORPESQUISA");
        System.out.println("DOUTOR PESQUISA == NULL => " + doutorPesquisa == null);
        if (doutorPesquisa != null) {
            return doutorPesquisa.getIdDoutor();
        }
        return null;
    }
    

    public List<Doutor> getRetornaDoutores() {
        return daoDoutor.buscaTodosDoutores();
    }

    public List<Pessoa> getRetornaClientes() {
        if (getNomePessoa() != null && getNomePessoa().length() > 1) {
            return daoPessoa.pesquisarNome(getNomePessoa());
        } else {
            return null;
        }
    }

    public List<Agendamento> getRetornaTodosAgendamentos() {
        return daoAgendamento.buscaTodosAgendamentos();
    }
    
    public List<Agendamento> getBuscaAgendamentos() {
        System.out.println("parametros " + dataInicial + " - " + dataFinal + " - " + doutorPesquisa);
        return daoAgendamento.buscaAgendamentoParamentros(dataInicial, dataFinal, doutorPesquisa);
    }

    public List<Item> getRetornaServicos() {
        if (getDescricaoServico() != null && getDescricaoServico().length() > 1) {
            return daoServico.buscaServicosDescricao(getDescricaoServico());
        } else {
            return null;
        }
    }

    public List<String> getHorariosDisponiveis() {
        if (getCodDoutor() != null && getData() != null) {
            return geraHorario.geraHorariosDisponivel(getCodDoutor(), getData());
        }
        return null;

    }

    public String getHorarioEscolhido() {
        if (getHorario() != null) {
            return sdf.format(getHorario());
        }
        return null;
    }

    public void setHorarioEscolhido(String horarioEscolhido) {
        try {
            setHorario(sdf.parse(horarioEscolhido));
        } catch (ParseException ex) {
            Logger.getLogger(AgendamentoBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public Date getDataInicial() {
        return dataInicial;
    }

    public void setDataInicial(Date data) {
        dataInicial = data;
    }
    
    public Date getDataFinal() {
        return dataFinal;
    }

    public void setDataFinal(Date data) {
        dataFinal = data;
    }    
    
}
